package com.meiyue.library.custom.service;

import com.meiyue.bean.base.PageModel;
import com.meiyue.library.custom.repository.BaseRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;

import java.io.Serializable;
import java.util.List;

/**
 * CustomRepositoryDemo
 * library.custom
 * Created by Chris Chen
 * 2017/9/15
 * Explain:封装最基本的Service
 */
public abstract class BaseService<T, I extends Serializable, R extends BaseRepository<T, I>> {
    @Autowired
    R dao;

    //1. 查询:一条数据
    public T getOne(I id) {
        return dao.findOne(id);
    }

    //2. 查询：数据列表 按照id升序排列
    public List<T> getList() {
        return dao.findAll(new Sort(Sort.Direction.ASC, "id"));
    }

    //3. 查询：数据分页 按照id升序排列
    public PageModel<T> getPage(int page, int pageSize) {
        //数据库分页查询起始id是从0开始的，请求的页码是从1开始的，所以处理的时候要减一
        return dao.getPage(new PageRequest(page > 0 ? page - 1 : 0, pageSize, new Sort(Sort.Direction.ASC, "id")));
    }

    //4. 增加：增加一条数据
    public boolean addOne(T t) {
        T data = dao.save(t);
        return data != null ? true : false;
    }

    //5. 增加：增添批量数据
    public boolean addList(List<T> dataList) {
        //todo 此处要做事务处理
        try {
            for (T t : dataList) {
                addOne(t);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    //6. 删除：删除一条记录
    public boolean removeOne(I id) {
        try {
            dao.delete(id);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    //7. 删除：批量删除
    public boolean removeList(String ids) {
        String[] idss = ids.split(",");
        //todo 此处需要事务处理
        try {
            for (String id : idss) {
                removeOne((I) id);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    //8. 修改：修改一条记录 对象必须包含id
    public boolean updateOne(T t) {
        try {
            dao.save(t);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}
